/**
 * 用户管理模块
 */
const router = require('koa-router')()
const Leave = require('../models/leaveSchema')
const Dept = require('../models/deptSchema')
const util = require('../utils/util')
const jwt = require('jsonwebtoken')
const md5 = require('md5')
router.prefix('/leave')

// 查询申请列表
router.get('/list', async (ctx) => {
    const { applyState, type } = ctx.request.query;
    const { page, skipIndex } = util.pager(ctx.request.query)
    let authorization = ctx.request.headers.authorization;
    let { data } = util.decoded(authorization)
    try {
        let params = {};
        if (type == 'approve') {
            if (applyState == 1 || applyState == 2) {
                params.curAuditUserName = data.userName;
                params.$or = [{ applyState: 1 }, { applyState: 2 }]
            } else if (applyState > 2) {
                params = { "auditFlows.userId": data.userId, applyState }
            } else {
                params = { "auditFlows.userId": data.userId }
            }
        } else {
            params = {
                "applyUser.userId": data.userId
            }
            if (applyState) params.applyState = applyState;
        }
        const query = Leave.find(params)
        const list = await query.skip(skipIndex).limit(page.pageSize)
        const total = await Leave.countDocuments(params);
        ctx.body = util.success({
            page: {
                ...page,
                total
            },
            list
        })

    } catch (error) {
        ctx.body = util.fail(`查询失败:${error.stack}`)
    }
})

// 获取用户的通知数量
router.get("/count", async (ctx) => {
    // token
    let authorization = ctx.request.headers.authorization;
    let { data } = util.decoded(authorization);
    try {
        let params = {}
        // 拿到当前用户的username作为当前审批人
        params.curAuditUserName = data.userName;
        // 查询待审批或者审批中的数据
        params.$or = [{ applyState: 1 }, { applyState: 2 }]

        // 查询当前用户符合是当前审批人且没审批完的数据条数
        const total = await Leave.countDocuments(params)
        ctx.body = util.success(total)
    } catch (error) {
        ctx.body = util.fail(`查询异常：${error.message}`)
    }
})

router.post("/operate", async (ctx) => {
    const { _id, action, ...params } = ctx.request.body
    let authorization = ctx.request.headers.authorization;
    let { data } = util.decoded(authorization)

    if (action == 'create') {
        // 生成申请单号
        let orderNo = "XJ"
        orderNo += util.formateDate(new Date(), "yyyyMMdd");
        // 用于计算与数据库集合中的过滤器匹配的文档数
        const total = await Leave.countDocuments()
        params.orderNo = orderNo + total;

        // 获取用户当前部门ID
        let id = data.deptId.pop()
        // 查找负责人信息
        let dept = await Dept.findById(id)
        // 获取人事部门和财务部门负责人信息
        let userList = await Dept.find({ deptName: { $in: ['人事部门'] } })

        // 一级审核人
        let auditUsers = dept.userName;
        // 一级负责人其他信息
        let auditFlows = [
            { userId: dept.userId, userName: dept.userName, userEmail: dept.userEmail }
        ]

        // 所有审批人信息放入auditFlows
        userList.map(item => {
            auditFlows.push({
                userId: item.userId,
                userName: item.userName,
                userEmail: item.userEmail
            })
            auditUsers += ',' + item.userName;
        })

        params.auditUsers = auditUsers;

        // 当前审批人
        params.curAuditUserName = dept.userName;

        // 所有的审批人数组
        params.auditFlows = auditFlows;

        params.auditLogs = []
        params.applyUser = {
            userId: data.userId,
            userName: data.userName,
            userEmail: data.userEmail
        }

        let res = await Leave.create(params)
        ctx.body = util.success("", "创建成功")
    } else {
        // 驳回/作废
        let res = await Leave.findByIdAndUpdate(_id, { applyState: 5 })
        ctx.body = util.success('', "操作成功")
    }

})

router.post("/approve", async (ctx) => {
    const { action, remark, _id } = ctx.request.body;
    let authorization = ctx.request.headers.authorization;
    let { data } = util.decoded(authorization);
    let params = {}
    try {
        // 1:待审批 2:审批中 3:审批拒绝 4:审批通过 5:作废
        let doc = await Leave.findById(_id)
        let auditLogs = doc.auditLogs || [];
        if (action == "refuse") {
            params.applyState = 3;
        } else {
            // 审核通过
            if (doc.auditFlows.length == doc.auditLogs.length) {
                ctx.body = util.success('当前申请单已处理，请勿重复提交')
                return;
            } else if (doc.auditFlows.length == doc.auditLogs.length + 1) {
                params.applyState = 4;
            } else if (doc.auditFlows.length > doc.auditLogs.length) {
                params.applyState = 2;
                params.curAuditUserName = doc.auditFlows[doc.auditLogs.length + 1].userName;
            }
        }
        auditLogs.push({
            userId: data.userId,
            userName: data.userName,
            createTime: new Date(),
            remark,
            action: action == 'refuse' ? "审核拒绝" : "审核通过"
        })
        params.auditLogs = auditLogs;
        let res = await Leave.findByIdAndUpdate(_id, params);
        ctx.body = util.success("", "处理成功");
    } catch (error) {
        ctx.body = util.fail(`查询异常：${error.message}`)
    }
})

module.exports = router;